使用HIVE SQL实现推荐系统数据补全

简介:

需求


在推荐系统场景中,如果基础行为数据太少,或者过于稀疏,通过推荐算法计算得出的推荐结果很可能达不到要求的数量。

比如,希望针对每个item或user推荐20个item,但是通过计算只得到8个,剩下的12个就需要补全。

策略

数据补全的具体策略是:

  • 补全时机:在挖掘计算结束后,挖掘结果导入HBase(最终web系统从HBase取数据)前,进行数据补全,补全后的数据再导入HBase。(还有另外一个可选时机,在接到请求后再在程序中实现补全,但这样的效率肯定没有直接从HBase中读数的高,所以空间换时间是更为合理的策略);

  • 实现技术:补全过程基于HIVE实现;

  • 补全数据:测试过程使用当前浏览item同分类下近一段时间的浏览量TopN;

  • 测试场景:本文仅针对“看了又看”进行数据补全实验,其它推荐需求类似。

实验过程

1. 首先在Oracle下调试SQL

调试过程涉及两张表:

(1)TEST_TOPN:


spacer.gif

该表中每行代表了一个item在某一天的访问量。

(2)TEST_X_AND_X:


该表中每行代表了针对每一个item的看了又看的item及其访问量。

我们的目的,就是将该表补全,针对每个current_item都要有5个看了又看的item。

比如,针对10001号item,需要从it分类下取得top2填补到该表中来。

Oracle中通过以下SQL成功实现该目的:

select * from

(select row_number() over(partition by current_item_category,current_item_id order by source,view_count desc) no,

current_item_id, current_item_category, andx_item_id, source, view_count from

(select current_item_id, current_item_category, andx_item_id, 1 source, view_count

from test_x_and_x

union

select a.current_item_id,a.current_item_category,b.item_id,2,b.view_count

from

(select current_item_id,current_item_category from test_x_and_x

group by current_item_id,current_item_category) a, test_topn b

where a.current_item_category = b.item_category

)) where no<=5

spacer.gif


注意:其中的source列用于标识数据来自原始表还是TOPN,所有TOPN的表数据都排在原始表数据之后。

2. 将Oracle中的SQL语句移植到HIVE中

成功移植的HIVE SQL:

select * from

(select rank() over(partition by c.current_item_category,c.current_item_id order by c.source,c.view_count desc) no,

c.current_item_id, c.current_item_category, c.andx_item_id, c.source, c.view_count

from

(select current_item_id,current_item_category,andx_item_id,1 source,view_count

from test_x_and_x

union all

select
a.current_item_id current_item_id,a.current_item_category
current_item_category,b.item_id andx_item_id,2 source,b.view_count
view_count

from

(select current_item_id,current_item_category from test_x_and_x

group by current_item_id,current_item_category) a, test_topn b

where a.current_item_category = b.item_category) c

) d where d.no <= 5;

执行结果和Oracle中完全一致:

0

移植过程中遇到一些坑,特此记录:

  1. HIVE只支持union all,不支持union;

  2. union all的两张表,不仅要对应字段数据类型相同,字段名(可使用列别名)也必须完全相同;

  3. 每一个嵌套子查询的结果集都必须使用表别名!

相关实践学习
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2天前
|
SQL 关系型数据库 MySQL
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
|
1天前
|
SQL 流计算 API
实时计算 Flink版产品使用合集之ClickHouse-JDBC 写入数据时,发现写入的目标表名称与 PreparedStatement 中 SQL 的表名不一致如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
8 0
|
2天前
|
消息中间件 关系型数据库 网络安全
实时计算 Flink版操作报错合集之Flink sql-client 针对kafka的protobuf格式数据建表,报错:java.lang.ClassNotFoundException 如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
12 1
|
2天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之在使用Flink SQL向ClickHouse写入数据的过程中出现丢数据或重复数据的情况如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
16 1
|
2天前
|
SQL 关系型数据库 数据库
实时计算 Flink版产品使用合集之将数据写入Elasticsearch时,若Elasticsearch中的字段类型为date,对应的SQL类型应该是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
23 0
|
2天前
|
SQL 资源调度 NoSQL
实时计算 Flink版产品使用合集之使用Flink CDC SQL MongoDB Connector时,可以采取什么措施来提升数据消费速率
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
19 0
|
4天前
|
SQL 关系型数据库 MySQL
|
4天前
|
SQL 关系型数据库 MySQL
|
4天前
|
SQL 数据库
Sql中如何添加数据
Sql中如何添加数据
10 0
|
4天前
|
SQL API 数据库
在Python中获取筛选后的SQL数据行数
在Python中获取筛选后的SQL数据行数
19 1